package com.kitbox.hl.meshow.common.utils.convertor;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

/**
 * map转实体 数组转换
 * @author tl 2017年5月26日 14:28:25
 *
 */
public class EntityToMapUtil {
	// Bean --> Map 1: 利用Introspector和PropertyDescriptor 将Bean --> Map
	public Map<String, Object> transBean2Map(Object obj) {
		if (obj == null) {
			return null;
		}
		Map<String, Object> map = new HashMap<String, Object>();
		try {
			BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
			for (PropertyDescriptor property : propertyDescriptors) {
				String key = property.getName();
				// 过滤class属性
				if (!key.equals("class")) {
					// 得到property对应的getter方法
					Method getter = property.getReadMethod();
					Object value = getter.invoke(obj);

					map.put(key, value);
				}

			}
		} catch (Exception e) {
		}
		return map;

	}

	/**
	 * 将一个 Map 对象转化为一个 JavaBean
	 * 
	 * @param type
	 *            要转化的类型
	 * @param map
	 *            包含属性值的 map
	 * @return 转化出来的 JavaBean 对象
	 * @throws IntrospectionException
	 *             如果分析类属性失败
	 * @throws IllegalAccessException
	 *             如果实例化 JavaBean 失败
	 * @throws InstantiationException
	 *             如果实例化 JavaBean 失败
	 * @throws InvocationTargetException
	 *             如果调用属性的 setter 方法失败
	 */
	@SuppressWarnings("rawtypes")
	public static Object convertMap(Class type, Map map)
			throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException {
		BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性
		Object obj = type.newInstance(); // 创建 JavaBean 对象

		// 给 JavaBean 对象的属性赋值
		PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
		for (int i = 0; i < propertyDescriptors.length; i++) {
			PropertyDescriptor descriptor = propertyDescriptors[i];
			String propertyName = descriptor.getName();

			if (map.containsKey(propertyName)) {
				// 下面一句可以 try 起来，这样当一个属性赋值失败的时候就不会影响其他属性赋值。
				Object value = map.get(propertyName);

				Object[] args = new Object[1];
				args[0] = value;

				descriptor.getWriteMethod().invoke(obj, args);
			}
		}
		return obj;
	}

	// Stirng 数组转为integer数组
	public Integer[] StringtoInt(String str) {
		if(str!=null&&!str.isEmpty()){
			String[] split = str.split(",");
			Integer ret[] = new Integer[split.length];

			StringTokenizer toKenizer = new StringTokenizer(str, ",");

			Integer i = 0;

			while (toKenizer.hasMoreElements()) {

				ret[i++] = Integer.valueOf(toKenizer.nextToken());

			}

			return ret;
		}
		return null;
		

	}
	// Stirng 数组转为BigDecimal数组
	public BigDecimal[] StringtoBigDecimal(String str) {
		if(str!=null&&!str.isEmpty()){
			String[] split = str.split(",");
			BigDecimal[] recol=new BigDecimal[split.length];
			int i=0;
			for (String string : split) {
				BigDecimal decimal = new BigDecimal(string);
				recol[i]=decimal;
				i++;
			}
			return recol;
		}
		return null;
		

	}
	// 数组转为BigDecimal数组  and      BigDecimal数组计算总和
		public BigDecimal BigDecimalCount(String str) {
			BigDecimal[] recol = this.StringtoBigDecimal(str);
			if(recol==null&&recol.length<=0){
				return null;
			}
			BigDecimal decimal = new BigDecimal(0);
			for (BigDecimal bigDecimal : recol) {
				decimal=decimal.add(bigDecimal);
			}
			return decimal;
			

		}
		//日期格式化
		public Date dateFomat(Date date) throws ParseException{
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			String format = sdf.format(date);
			date = sdf.parse(format);
			return date;
		}
}
